//
//  HankViewController.m
//  RACHank
//
//  Created by ZhangBo on 2018/12/3.
//  Copyright © 2018 ZhangBo. All rights reserved.
//

#import "DayOneViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
#import "Person.h"
#import "HankView.h"

@interface DayOneViewController ()
@property(nonatomic, strong) id <RACSubscriber> subscriber;
@property(weak, nonatomic) IBOutlet HankView *HKView;
@end

@implementation DayOneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

#pragma mark -- block

- (void)block1 {
    Person *p = [[Person alloc] init];
    PersonBlock_1 block = ^(void) {
        NSLog(@"block1");
    };
    p.block1 = block;
    p.block1();
}

- (void)block2 {
    Person *p = [[Person alloc] init];
    [p eat:^(NSString *string) {
        NSLog(@"%@", string);
    }];
}

- (void)block3 {
    Person *p = [[Person alloc] init];
    PersonBlock_3 block = p.run;
    block(@"fuck you");
}


- (void)test_rac1 {
    //1.block作为对象的属性!!
    [self block1];
    //2.block作为方法的参数!!
    [self block2];
    //3.block作为返回值!!!(扩展非常强!!)
    [self block3];
}

#pragma mark -- signal

- (void)test_rac2 {
    //    RACSignal: 信号类,当我们有数据产生,创建一个信号!
    //1.创建信号(冷信号!)
    //didSubscribe调用:只要一个信号被订阅就会调用!!
    //didSubscribe作用:利用subscriber发送数据!!
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"呵呵哈哈嘿嘿"];

        return nil;
    }];

    //2.订阅信号(热信号!!)
    //nextBlock调用:只要订阅者发送数据就会调用!
    //nextBlock作用:处理数据,展示UI界面!
    [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"%@", x);
    }];

    //创建信号
    RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
        //1.订阅者发送信号内容
        [subscriber sendNext:@"发送信号内容"];
        //2.订阅者发送信号完成的信息，不需要再发送数据时，最好发送信号完成，可以内部调起清理信号的操作。
        [subscriber sendCompleted];
        //3.创建信号的Block参数，需要返回一个RACDisposable对象 ，可以返回nil。
        //RACDisposable对象用于取消订阅信号，此block在信号完成或者错误时调用。
        RACDisposable *racDisposable = [RACDisposable disposableWithBlock:^{
            NSLog(@"信号Error或者Complete时销毁");
        }];
        return racDisposable;
    }];

    //订阅信号
    [signal2 subscribeNext:^(id x) {
        //新变化的值
        NSLog(@"订阅信号：subscribeNext:%@", x);
    }                error:^(NSError *error) {
        //信号错误，被取消订阅,被移除观察
        NSLog(@"订阅信号：Error:%@", error.description);
    }            completed:^{
        //信号已经完成，被取消订阅，被移除观察
        NSLog(@"订阅信号：subscribeComplete");
    }];

}

- (void)test_rac3 {
    //1.创建信号(冷信号!)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"呵呵哈哈嘿嘿"];
        self.subscriber = subscriber;
        return [RACDisposable disposableWithBlock:^{
            //只要信号取消订阅就会来这里
            //清空资源!!
            NSLog(@"哥么来了!!");
        }];
    }];


    //2.订阅信号(热信号!!)
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"%@", x);
    }];

    //默认一个信号发送数据完毕就会主动取消订阅
    //只要订阅者在,就不会自动取消订阅
    //手动取消订阅
    [disposable dispose];
}

#pragma mark -- subject

- (void)test_rac4 {
    //1.创建信号
    RACSubject *subject = [RACSubject subject];

    //2.订阅信号
    //不同的信号订阅的方式不一样!!(因为类型不一样,所以调用的方法不一样)
    //RACSubject处理订阅:拿到之前的_subscribers保存订阅者
    [subject subscribeNext:^(id x) {
        NSLog(@"接受到了数据:%@", x);
    }];
    //3.发送数据
    //遍历出所有的订阅者,调用nextBlock
    [subject sendNext:@"汉堡包"];
}

- (void)test_rac5 {
    //订阅信号
    [self.HKView.btnSingnal subscribeNext:^(id x) {
        self.view.backgroundColor = x;
    }];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self test_rac3];
}

@end
